package com.dzt.androidframework.database.dao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.dzt.androidframework.utils.JLogKit;

import java.util.HashSet;


/**
 * Created by dzt on 2017/4/24.
 * 数据库帮助类
 * 数据库升级原理：
 * 1.V1.0
 * 安装v1.0,假设v1.0版本只有一个account表，这时走继承SQLiteOpenHelper的onCreate，不走onUpgrade
 * 2.V2.0
 * v1.0版本只有一个account表，软件版本升级到v2.0了，但是v2.0数据库需要新增一个member表
 * (1)、v1.0   -->  v2.0              不走onCreate，走onUpgrade
 * (2)、v2.0(直接安装v2.0)          走onCreate，不走onUpgrade
 * 3.V3.0
 * (1)、v1.0     DATABASE_VERSION=1000    onCreate      --添加--  account
 * (2)、v2.0     DATABASE_VERSION=1001    onCreate      --添加--  account  （v1.0代码不变）  onUpgrade（DATABASE_VERSION>1000）
 * onUpgrade   --添加--  member
 * (3)、v3.0     DATABASE_VERSION=1002    onCreate      --添加--  account  （v1.0代码不变）  onUpgrade（DATABASE_VERSION>1001）
 * onUpgrade   --添加--  member （v2.0代码不变）
 * onUpgrade   --添加--  news
 */

public class SQLiteHelper extends SQLiteOpenHelper {
	public static final int DB_VERSION = 4;
	public static final String DB_NAME = "framework.db";

	private static final HashSet<String> validTables = new HashSet<>();

	static {
		validTables.add(SQL.TB_TASKS);
		validTables.add(SQL.TB_TEST);
		validTables.add(SQL.TB_EXPRESS);
	}

	public SQLiteHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}

	/**
	 * 检测是否为有效的表
	 *
	 * @param name
	 * @return
	 */
	public static boolean isValidTable(String name) {
		return validTables.contains(name);
	}

	/**
	 * 清除一张表
	 *
	 * @param db
	 */
	private void dropTaskTable(SQLiteDatabase db) {
		db.execSQL("drop table if exists " + SQL.TB_TEST);
	}

	/**
	 * 修改一张表用到的关键字，add/change/modify/drop/
	 *
	 * @param db
	 */
	private void alterTaskTable(SQLiteDatabase db) {
		db.execSQL("alter table " + SQL.TB_TASKS + " add typ integer");   //添加
		db.execSQL("alter table " + SQL.TB_TASKS + " add test integer");
//		db.execSQL("alter table " + SQL.TB_TASKS + " change typ type integer");  //改名
//		db.execSQL("alter table " + SQL.TB_TASKS + " modify type varchar");  //修改变量类型
		//db.execSQL("alter table " + SQL.TB_TASKS + " drop test integer");  //删除
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		JLogKit.getInstance().e("onCreate");
		db.execSQL(SQL.CREATE_TASK_TABLE);
		final int FIRST_DB_VERSION = 1;
		onUpgrade(db, FIRST_DB_VERSION, DB_VERSION);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
		JLogKit.getInstance().e("onUpgrade oldV = " + oldV + " newV = " + newV);
		//使用for实现跨版本升级数据库
		for (int v = oldV; v < newV; v++) {
			//db.beginTransaction();
			switch (v) {
				case 1:
					upgradeToVersion2(db);
					break;
				case 2:
					upgradeToVersion3(db);
					break;
				case 3:
					upgradeToVersion4(db);
					break;
				default:
					throw new IllegalStateException("Don't know how to upgrade to " + v);
			}
			//db.endTransaction();
		}
	}

	private void upgradeToVersion2(SQLiteDatabase db){
		db.execSQL(SQL.CREATE_TASK_TEST_TABLE);
	}

	private void upgradeToVersion3(SQLiteDatabase db){
		dropTaskTable(db);
		alterTaskTable(db);
	}

	private void upgradeToVersion4(SQLiteDatabase db){
		db.execSQL(SQL.CREATE_EXPRESS_TABLE);
	}
}
